#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <mysql/mysql.h>

#include <sys/ioctl.h>  
#include <sys/socket.h>  
#include <sys/types.h>  
#include <netdb.h>  
#include <net/if.h>  
#include <arpa/inet.h> 
#include <unistd.h>
#include <fcntl.h>

//AP各栏目枚举
enum bar
{
	//ID ,
	CON_REFRESH = 0,
	CON_TXPOWER,
	CON_CHANNEL,
	CON_SSID,
	CON_ENCTYPT,
	CON_KEY, //=5
	IMG_UPAUTO,
	LIMIT_SIG,
	CON_TXPOWER_TWO,
	CON_CHANNEL_TWO,
	CON_SSID_TWO,//=10
	CON_ENCTYPT_TWO,
	CON_KEY_TWO,
	END		//=13
};


typedef struct AP_Stainfo
{
	char aid[3];
	char psm[10];
	char mimops[10];
	char mcs[20];
	char  bw[10];
	char sgi[10];
	char stbc[10];
	char mac[20];
	struct AP_Stainfo *next;
}STAINFO;
//AP设置项目
typedef struct APWirelessSetting
{
	char txpower[4];
	char channel[4];
	char ssid[64];
	char encrypt[10];
	char key[24];
	char refresh[2];
	char upauto[2];
	char imgver[8];
	char limit_s[2];
	char max_listen[5];
//#ifdef WTP_9557
	char txpower_t[4];
	char channel_t[4];
	char ssid_t[64];
	char encrypt_t[10];
	char key_t[24];
//#endif
}APWLANSET;

//AP配置是否需要更新
#define NEEDNUP 0 
#define NEEDUP 1
//操作是否成功
#define fAILED 0 
#define SUCCESS 1
//AP配置的操作
#define READCONFIG 0
#define DEFCONFIG 1		//恢复默认设置
#define REBOOTAP  2		//重启AP
#define UPDATASYS 3		//更新固件
//去请你局变量
int gsta_count;		//sta 数量
char gAP_macaddr[20];	//AP mac地址
char gAP_IPaddr[20];	//AP IP地址
char gAC_IPaddr[20];	//AC IP地址
APWLANSET local_ap_conf;
#define DEFAULT_CONFIG_M "ff:ff:ff:ff:ff:ff" 		 // 默认配置下发的标志
#define GETMACIF "br-lan"                    		 // 获得mac地址的对应端口

#define DATABS_UNAME "root"				// 连接的数据库用户名
#define DATABS_UPASSWD "anxun007"			// 连接的数据库用户密码
#define DATABS_DBNAME "acdb"				// 连接的数据库名
#define DEFAULT_ACIP "192.168.10.1"			// 默认AC（数据库）的IP地址
											
#define DATABS_APMANAGE_TAB "AP_Manage_Online"  	//AP管理数据表名称
#define DATABS_APUPDATE_TAB "AP_UpGrad"			//AP升级信息数据表名称
#define DATABS_STAINFO_TAB "AP_StaInfo"			//AP上传station信息数据表名称

//OpenWrt系统获取无线配置命令
#ifdef WTP_9341 
#define OPENWRT_GET_TXPOWER "uci get wireless.radio0.txpower"			// 获取无线功率
#define OPENWRT_GET_CHANNEL "uci get wireless.radio0.channel"			// 获得无线信道
#endif

#ifdef WTP_7620 
#define OPENWRT_GET_TXPOWER "uci get wireless.ra0.txpower"			// 获取无线功率
#define OPENWRT_GET_CHANNEL "uci get wireless.ra0.channel"			// 获得无线信道
#endif

#ifdef WTP_9557
#define OPENWRT_GET_TXPOWER "uci get wireless.wifi0.txpower"			// 获取无线功率
#define OPENWRT_GET_CHANNEL "uci get wireless.wifi0.channel"			// 获得无线信道
#define OPENWRT_GET_TXPOWER_TWO "uci get wireless.wifi1.txpower"		// 获取无线功率		--双频2
#define OPENWRT_GET_CHANNEL_TWO "uci get wireless.wifi1.channel"		// 获得无线信道		--双频2
#endif

#ifdef WTP_9557_DEF
#define OPENWRT_GET_TXPOWER "uci get wireless.radio1.txpower"			// 获取无线功率
#define OPENWRT_GET_CHANNEL "uci get wireless.radio1.channel"			// 获得无线信道
#define OPENWRT_GET_TXPOWER_TWO "uci get wireless.radio0.txpower"		// 获取无线功率		--双频2
#define OPENWRT_GET_CHANNEL_TWO "uci get wireless.radio0.channel"		// 获得无线信道		--双频2

#define OPENWRT_GET_SSID "uci get wireless.@wifi-iface[1].ssid"			// 获得ssid
#define OPENWRT_GET_ENCRYPTION "uci get wireless.@wifi-iface[1].encryption"	// 获得无线加密方式
#define OPENWRT_GET_ENKEY "uci get wireless.@wifi-iface[1].key"			// 获得加密密码
#define OPENWRT_GET_MAXLISTEN "uci get wireless.@wifi-iface[1].maxassoc"	// 获得最大连接数
#define OPENWRT_GET_SSID_TWO "uci get wireless.@wifi-iface[0].ssid"		// 获取ssid		--双频2
#define OPENWRT_GET_ENCRYPTION_TWO "uci get wireless.@wifi-iface[0].encryption"	// 获取无线加密方式	--双频2 
#define OPENWRT_GET_ENKEY_TWO "uci get wireless.@wifi-iface[0].key"		// 获取加密密码		--双频2
#define OPENWRT_GET_MAXLISTEN_TWO "uci get wireless.@wifi-iface[0].maxassoc" 	// 获取最大连接数	--双频2
#endif

#ifndef WTP_9557_DEF
#define OPENWRT_GET_SSID "uci get wireless.@wifi-iface[0].ssid"			// 获得ssid
#define OPENWRT_GET_ENCRYPTION "uci get wireless.@wifi-iface[0].encryption"	// 获得无线加密方式
#define OPENWRT_GET_ENKEY "uci get wireless.@wifi-iface[0].key"			// 获得加密密码
#define OPENWRT_GET_MAXLISTEN "uci get wireless.@wifi-iface[0].maxassoc"	// 获得最大连接数

#define OPENWRT_GET_SSID_TWO "uci get wireless.@wifi-iface[1].ssid"		// 获取ssid		--双频2
#define OPENWRT_GET_ENCRYPTION_TWO "uci get wireless.@wifi-iface[1].encryption"	// 获取无线加密方式	--双频2 
#define OPENWRT_GET_ENKEY_TWO "uci get wireless.@wifi-iface[1].key"		// 获取加密密码		--双频2
#define OPENWRT_GET_MAXLISTEN_TWO "uci get wireless.@wifi-iface[1].maxassoc" 	// 获取最大连接数	--双频2
#endif
//OpenWrt系统设置无线配置命令
#ifdef WTP_9341
#define OPENWRT_SET_TXPOWER "uci set wireless.radio0.txpower"			// 设置无线功率
#define OPENWRT_SET_CHANNEL "uci set wireless.radio0.channel"			// 设置无线信道
#endif

#ifdef WTP_7620
#define OPENWRT_SET_TXPOWER "uci set wireless.ra0.txpower"			// 设置无线功率
#define OPENWRT_SET_CHANNEL "uci set wireless.ra0.channel"			// 设置无线信道
#endif

#ifdef WTP_9557
#define OPENWRT_SET_TXPOWER "uci set wireless.wifi0.txpower"			// 设置无线功率
#define OPENWRT_SET_CHANNEL "uci set wireless.wifi0.channel"			// 设置无线信道

#define OPENWRT_SET_TXPOWER_TWO "uci set wireless.wifi1.txpower"		// 设置无线功率		--双频2
#define OPENWRT_SET_CHANNEL_TWO "uci set wireless.wifi1.channel"		// 设置无线信道		--双频2
#endif

#ifdef WTP_9557_DEF
#define OPENWRT_SET_TXPOWER "uci set wireless.radio1.txpower"			// 获取无线功率
#define OPENWRT_SET_CHANNEL "uci set wireless.radio1.channel"			// 获得无线信道
#define OPENWRT_SET_TXPOWER_TWO "uci set wireless.radio0.txpower"		// 获取无线功率		--双频2
#define OPENWRT_SET_CHANNEL_TWO "uci set wireless.radio0.channel"		// 获得无线信道		--双频2

#define OPENWRT_SET_SSID "uci set wireless.@wifi-iface[1].ssid"			// 设置ssid
#define OPENWRT_SET_ENCRYPTION "uci set wireless.@wifi-iface[1].encryption"	// 设置无线加密方式
#define OPENWRT_SET_ENKEY "uci set wireless.@wifi-iface[1].key"			// 设置加密密码
#define OPENWRT_SET_MAXLISTEN "uci set wireless.@wifi-iface[1].maxassoc"      	// 设置最大连接数

#define OPENWRT_SET_SSID_TWO "uci set wireless.@wifi-iface[0].ssid"	  	// 设置ssid		--双频2
#define OPENWRT_SET_ENCRYPTION_TWO "uci set wireless.@wifi-iface[0].encryption"	// 设置无线加密方式	--双频2 
#define OPENWRT_SET_ENKEY_TWO "uci set wireless.@wifi-iface[0].key"		// 设置加密密码		--双频2
#define OPENWRT_SET_MAXLISTEN_TWO "uci set wireless.@wifi-iface[0].maxassoc" 	// 设置最大连接数	--双频2
#endif
#ifndef WTP_9557_DEF
#define OPENWRT_SET_SSID "uci set wireless.@wifi-iface[0].ssid"			// 设置ssid
#define OPENWRT_SET_ENCRYPTION "uci set wireless.@wifi-iface[0].encryption"	// 设置无线加密方式
#define OPENWRT_SET_ENKEY "uci set wireless.@wifi-iface[0].key"			// 设置加密密码
#define OPENWRT_SET_MAXLISTEN "uci set wireless.@wifi-iface[0].maxassoc"      	// 设置最大连接数

#define OPENWRT_SET_SSID_TWO "uci set wireless.@wifi-iface[1].ssid"	  	// 设置ssid		--双频2
#define OPENWRT_SET_ENCRYPTION_TWO "uci set wireless.@wifi-iface[1].encryption"	// 设置无线加密方式	--双频2 
#define OPENWRT_SET_ENKEY_TWO "uci set wireless.@wifi-iface[1].key"		// 设置加密密码		--双频2
#define OPENWRT_SET_MAXLISTEN_TWO "uci set wireless.@wifi-iface[1].maxassoc" 	// 设置最大连接数	--双频2
#endif

#define OPENWRT_COMMIT_CONF "uci set wireless.@wifi-iface[0].wds=0 && uci commit wireless"

#define RES_NET "wifi"				// 重启网络服务
#define RES_DHCP "echo 222"			// 重启dhcpcd
//#define RES_NET "/etc/init.d/network restart"						// 重启网络服务
//#define RES_DHCP "sleep 1 && killall dhcpcd && sleep 2 && dhcpcd br-lan"		// 重启dhcpcd

#define GET_RX_BYT "ifconfig br-lan|grep \"RX bytes\"|awk -F ' ' '{printf $3$4}'"	// 获得br-lan网口的累计RX流量
#define GET_TX_BYT "ifconfig br-lan|grep \"TX bytes\"|awk -F ' ' '{printf $7$8}'"	// 获得br-lan网口的累计TX流量
// in Manage.c 部分通用数据库操作以及mac，ip获取等
int get_srand_num();                                            //获得一个随机值
int Get_ipaddr(char *szIP);                                     // 获得本机IP地址
int Get_AC_IP(char *ip_value);                                  // 获取AC的IP地址
int Get_AP_MacAddr(char *szMac);                                // 获得本地mac地址
int connect_dataBS(MYSQL *mysql, char *db_server);              // 连接数据库
void  CWProtocolRetrieveStr(char *value, int *offer, char *str, int lenth);  // 解析

// in APManage.c AP根据数据库进行自身配置与升级
void Get_AP_Info(char *value);                                  // 获得AP的自身信息
int WriteWirelessSetting(APWLANSET set);                        // 将配置生成配置列表
int Compare_And_Handle_Information(APWLANSET *apset);           // 对比以及处理下载的配置信息
int Updata_Manage_DataBS(MYSQL mysql, char *apmac, int type);   // 更新数据库信息（Refresh状态）
int Read_Manage_DataBS(MYSQL mysql, char* apmac, APWLANSET *set, char *myipaddr, int model_type);  // 读取AP_Manage数据库，通过mac地址获取配置信息。
int Read_AP_UpgradeBS(MYSQL mysql, char *sysname, char *APimgname, char *imgver);                  // 读取AP_UpGrade数据库，通过型号获取升级信息。

// in UploadStainfo.c 获得本地连接的用户将用户信息上传数据库
void free_list(STAINFO *head);                                  // 释放链表
STAINFO *get_station_info();                                    // 获取本机上的station信息并组合成链表
int get_AP_flow(char *rxbyt, char *txbyt);                      // 获得RXTX流量
int fomat_dataBS(MYSQL mysql, char *APmac);                     // 通过APmac地址删除数据库的相关信息
int uppload_dataBS(MYSQL mysql, STAINFO *head, int *stacount);  // 更新数据库station的信息
int Change_OL_Status(MYSQL mysql, char *APmac);                 // 修改AP的在线状态
